{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e3282e94",
   "metadata": {},
   "source": [
    "# Python 2和3的核心区别"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "89e7e006",
   "metadata": {},
   "source": [
    "不少企业的代码或实际项目升级Python版本的成本很高，所以保留了相当多的Python 2程序。为了阅读与运维这些程序，了解Python 2和3的一些核心区别十分重要"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "738480a2",
   "metadata": {},
   "source": [
    "## 整数除法\n",
    "\n",
    "- Python 2中，两个整数的运算结果只能是整数，对于除不尽的情况，Python 2会将结果向下取整，返回小于该结果的最大整数，如12/5的值为2。\n",
    "- Python 3中，除法返回浮点数，12/5的结果为2.4。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e1b08020",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.4"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "12 / 5"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "bbb55f6d",
   "metadata": {},
   "source": [
    "## 整形与长整型\n",
    "\n",
    "- Python 2中，当整数大于一定范围时，Python 2会自动将整数由整型转换为长整型（long），长整型以数字+L表示，如12345678765434567876543L。\n",
    "- Python 3中，长整型被取消，整数都是整型（int）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "42fedda1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12345678765434567876543"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "12345678765434567876543"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ada243c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "int"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(12345678765434567876543)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "2541aa66",
   "metadata": {},
   "source": [
    "## f字符串\n",
    "\n",
    "- Python 3中，引入了f字符串进行格式化，可以在占位符中直接使用已有变量的表达式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "51229ab6",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "40844106",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'a=100, a is 100'"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f\"{a=}, a is {a}\""
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "8779621e",
   "metadata": {},
   "source": [
    "## 字符串类型\n",
    "\n",
    "- Python 2中，str类型默认使用ASCII编码，unicode类型使用Unicode编码\n",
    "- Python 3中，str类型默认使用Unicode编码，bytes类型使用ASCII编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a33fef52",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = \"中国\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "983bf4f5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "str"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a7353aff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "8ae4eddc",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = b'abc'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "8917106e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "bytes"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(a)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "3d5be59f",
   "metadata": {},
   "source": [
    "## 不同类型的比较\n",
    "\n",
    "- Python 2中，支持，如字符串与数字可以比较大小\n",
    "- Python 3中，不支持，字符串与数字不可以比较大小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "5c61dbc6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 3 > \"abc\" #会报错"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "958e4ebe",
   "metadata": {},
   "source": [
    "## 字典键值对方法的返回类型\n",
    "\n",
    "- Python 2中，.keys()、.values()、.items()方法返回列表\n",
    "- Python 3中，.keys()、.values()、.items()方法分别返回dict_keys、dict_values、dict_items类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f44621c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = {1: 1, 2: 4}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "8bbfe732",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(dict_keys([1, 2]), dict_values([1, 4]), dict_items([(1, 1), (2, 4)]))"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.keys(), a.values(), a.items()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "0a7bc6c2",
   "metadata": {},
   "source": [
    "## range(), map(), filter(), zip()函数返回值\n",
    "\n",
    "- Python 2中，返回列表\n",
    "- Python 3中，返回一个迭代器对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "501b8879",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "range(0, 5)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "range(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "708a7b44",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<zip at 0x10b9a0340>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "zip([1,2,3], [4,5,6])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "e6b7930b",
   "metadata": {},
   "source": [
    "## ord(), chr()函数\n",
    "\n",
    "- Python 2中，只支持ASCII字符码即0-255\n",
    "- Python 3中，支持所有Unicode码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b9f8a2aa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25105"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ord(\"我\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "d4f829b6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'我'"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chr(25105)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "3de02656",
   "metadata": {},
   "source": [
    "## round()函数\n",
    "\n",
    "- Python 2中，数字5四舍五入到离0较远的一边\t\n",
    "- Python 3中，数字5近似到偶数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "1ec96a68",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "round(1.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "62abe480",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "round(2.5)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "b6c52125",
   "metadata": {},
   "source": [
    "## 迭代器对象的下一个值\n",
    "\n",
    "- Python 2中，`.next()`方法\n",
    "- Python 3中，`.__next__()`方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1e00cf64",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = [1, 2, 3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "04bbd79a",
   "metadata": {},
   "outputs": [],
   "source": [
    "i = a.__iter__()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "8e2001ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "i.__next__()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7efacbf0",
   "metadata": {},
   "source": [
    "## pathlib模块\n",
    "\n",
    "- Python 3中，新增pathlib模块，处理路径"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "78ab9791",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "94d8f514",
   "metadata": {},
   "outputs": [],
   "source": [
    "p = Path(\".\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "4ad5b46f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PosixPath('123.txt')"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p / \"123.txt\""
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "359c7dc0",
   "metadata": {},
   "source": [
    "## urllib模块\n",
    "\n",
    "- Python 2中，urllib和urllib2两个模块\n",
    "- Python 3中，功能移到urllib.request和urllib.parse两个子模块"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab63e19a",
   "metadata": {},
   "source": [
    "## 运算符@\n",
    "\n",
    "- Python 3中，矩阵乘法可以以运算符`@`实现："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "a51c1f99",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "4cda0dd6",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = np.array([[1, 2], [3, 4]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "e3c23473",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 7, 10],\n",
       "       [15, 22]])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a @ a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "75ebfc2c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 7, 10],\n",
       "       [15, 22]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.dot(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1736850d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
